package LC.linkedList;

public class Node {
    /**
     * 这里我默认存储的数据都是整数
     */
    private int data;

    /**
     * 存放下一个地址的引用
     */
    private Node next;


    /**
     * 编写构造方法
     * @param i
     */
    public Node(int data) {
        this.data = data;
    }

    /**
     * 获取下一个节点的方法
     *
     * @return
     */
    public Node next() {
        return this.next;
    }

    /**
     * 获取节点中的数据
     *
     * @return
     */
    public int getData() {
        return this.data;
    }

    /**
     * 为节点追加节点 （解决不断增加的问题）
     *
     * @param node
     * @return
     */
    public Node append(Node node) {
        // 获得当前节点
        Node currentNode = this;
        // 循环向后找，找到下一个节点为空的最后一个节点
        while (true) {
            // 取出下一个节点
            Node nextNode = currentNode.next;
            // 如果下一个节点为 Null, 当前节点已经是最后一个节点
            if (nextNode == null) {
                break;
            }
            // 赋值给当前节点
            currentNode = nextNode;

        }
        // 把需要追加的节点追加到当前找到的当前节点
        currentNode.next = node;
        return this;
    }

    /**
     * 当前节点是否为最后一个节点
     *
     * @return
     */
    public boolean islast() {
        return this.next == null;
    }

    /**
     * 删除下一个节点
     */
    public void removeNext() {
        // 取出下下一个节点
        Node newNext = next.next;
        // 把下下一个节点设置为当前节点的下一个节点
        this.next = newNext;
    }

    /**
     * 插入一个节点，作为当前节点的下一个节点，这就可以类比为 交换两个数字的值
     *
     * @param node
     */
    public void after(Node node) {
        // 取出下一个节点，作为下下一个节点
        Node nextNext = next;
        // 把新节点插入为当前节点的下一个节点
        this.next = node;
        // 把下下一个节点作为新节点的下一个节点
        node.next = nextNext;
    }

}
